In relational database management systems (RDBMS), a “transaction” refers to an exchange between a workstation and a program, two workstations, or two programs that accomplish a particular action or result. The transaction begins when the exchange begins and ends when commitment is made to the particular action or result. Several conventional RDBMS support sub-transactions through the use of savepoints. Savepoints are created between the beginning of the transaction and the commit. The savepoints allow modifications made to data since a savepoint to be undone. This is referred to herein as “rollback to a savepoint”.
For example, assume that a user, through a workstation and/or application, accesses a RDBMS for a travel agency. The user wishes to book airline, hotel, and rental car reservations. The user researches available flights and books airline reservations. A first savepoint is established. The user further researches available hotels and books hotel reservations. A second savepoint is established. The user then researches available rental cars but cannot find a suitable reservation which matches the hotel reservation. The user may then roll back to the first savepoint to search for a different hotel. The data modified since the first savepoint are undone so that the user can book reservations at a different hotel.
For transactions to occur with integrity, two transactions must be prevented from updating the same piece of data at the same time. Locks on the data being updated are typically used. For example, if user A, performing transaction A, is updating data pertaining to reservations for an airline flight, a lock is established on the airline flight data. With this lock, user B, performing transaction B, is prevented from updating the same airline flight data at the same time as user A, and must wait until transaction A completes and releases the lock. Similarly, for transactions to read data with integrity, a read transaction must be prevented from seeing data that has been changed by an updating transaction but not yet committed, and be allowed to see data that has been changed by an updating transaction as soon as it is committed. Locks on the data being read are typically used. For example, if user A, performing transaction A, is updating data pertaining to reservations for an airline flight, a lock is established on the airline flight data. User B, performing read transaction B, cannot read that data until transaction A completes and releases the lock.
If a read transaction requires read stability or read repeatability for the duration of the transaction, read locks are held until the read transaction is completed. Thus, if transaction C is a read transaction that reads airline reservation information and that requires read stability or repeatability, transaction C will establish locks on all data read. Another transaction, D, wishing to update the airline reservation information, must wait for read transaction C to complete and release the lock.
When rollback to savepoint occurs, one must consider locks acquired since the savepoint. Those locks taken to provide read stability or repeatability of data read since the savepoint must not be released, while those locks taken to keep the changes, now being rolled back, from being seen by other transactions may be released.
Accordingly, there exists a need for a method for selectively releasing locks when rolling back to a savepoint. The present invention should build upon a common feature of lock manages, the capacity to efficiently release locks owned by a given owning work unit. The method should not incur unduly burdensome overhead. The present invention addresses such a need.